﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;


namespace Iudicium.Seguridad.CRN
{
    /// <summary>
    /// Descripción breve de RolCRN
    /// </summary>
    public class RolCRN
    {
        public RolCRN()
        {
            //
            // TODO: Agregar aquí la lógica del constructor
            //
        }


        public static Iudicium.Seguridad.Rol GetRolById(int rolId)
        {
            if (rolId <= 0)
            {
                throw new ArgumentException("El id del rol no puede ser menor que cero.");
            }

            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();

            RolDS.RolDataTable table = adapter.GetRolById(rolId);

            if (table == null || table.Count <= 0)
            {
                throw new Exception("Hubo un error en la ejecucion del SQL al tratar de obtener el ROL con id " + rolId);
            }
            Rol rolResult = ConstruirRol(table[0]);
            return rolResult;
        }

        public static Iudicium.Seguridad.Rol GetRolByNombre(string nombre)
        {
            if (string.IsNullOrEmpty(nombre))
            {
                throw new ArgumentException("El nombre del rol no puede ser nulo o vacio.");
            }

            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();

            RolDS.RolDataTable table = adapter.GetRolByNombre(nombre);

            if (table == null || table.Count <= 0)
            {
                throw new Exception("Hubo un error en la ejecucion del SQL al tratar de obtener el ROL con nombre: " + nombre);
            }
            Rol rolResult = ConstruirRol(table[0]);
            return rolResult;
        }

        public static List<Iudicium.Seguridad.Rol> GetRolesBySearch(string parametro)
        {
            List<Iudicium.Seguridad.Rol> lista = new List<Iudicium.Seguridad.Rol>();

            if (parametro == null)
            {
                parametro = "";
            }

            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();

            RolDS.RolDataTable table = adapter.GetRolBySearch(parametro);

            if (table == null)
            {
                throw new Exception("Hubo un error en la ejecucion del SQL al tratar de obtener el ROL con nombre: " + parametro);
            }
            foreach (RolDS.RolRow row in table)
            {
                Rol objRol = ConstruirRol(row);
                lista.Add(objRol);
            }
            return lista;
        }

        public static void UpdateRol(Rol rol)
        {
            if (rol == null)
            {
                throw new ArgumentException("El objeto ROL pasado por parametro no puede ser nulo");
            }
            if (rol.RolId <= 0)
            {
                throw new ArgumentException("El ID del ROL no puede ser menor o igual que cero.");
            }
            if (string.IsNullOrEmpty(rol.NombreRol))
            {
                throw new ArgumentException("El Nombre del ROL no puede ser nulo o vacio.");
            }

            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();
            adapter.Update(rol.RolId, rol.NombreRol, rol.Estado.ToString(), rol.ListaPermisos);

        }

        public static void InsertRol(Rol rol)
        {
            if (rol == null)
            {
                throw new ArgumentException("El objeto ROL pasado por parametro no puede ser nulo");
            }
            if (string.IsNullOrEmpty(rol.NombreRol))
            {
                throw new ArgumentException("El Nombre del ROL no puede ser nulo o vacio.");
            }
            int? rolId = 0;
            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();
            adapter.Insert(ref rolId, rol.NombreRol, rol.Estado.ToString(), rol.ListaPermisos);

            if (rolId == null || rolId.Value <= 0)
            {
                throw new Exception("El id del rol no se genero correctamente");
            }
            rol.RolId = rolId.Value; 
        }

        public static void DeleteRol(int rolId)
        {
            if (rolId <= 0)
            {
                throw new ArgumentException("El id del rol no puede ser menor que cero.");
            }

            RolDSTableAdapters.RolTableAdapter adapter = new RolDSTableAdapters.RolTableAdapter();
            adapter.Delete(rolId);
        }

        private static Iudicium.Seguridad.Rol ConstruirRol(RolDS.RolRow row)
        {
            return new Rol(row.rolId, row.nombre, Rol.GetEstadoRolFromString(row.estado));
        }
    }

}